


// 泛型
// 泛型（Generics）是指在定义函数、接口或类的时候，不预先指定具体的类型，而在使用的时候再指定类型的一种特性。


/* function createArray(length: number, value: any): Array<any> {
    let result = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray(3, 'x'); // ['x', 'x', 'x']
createArray(3, 10); // [10,10,10] */


// 所谓函数泛型: 就是在函数声明时, 给函数添加了类型参数放到<>中,在函数调用时在<>传入类型

// function createArray<T>(length: number, value: T): Array<T> {
//     let result:T[] = [];
//     for (let i = 0; i < length; i++) {
//         result[i] = value;
//     }
//     return result;
// }

// createArray<number>(3, 10); // [10,10,10]
// createArray<string>(3, "x"); // [10,10,10]


// 多个类型参数
// 传入一个数组(两个元素),交换两个数的值
/* function swap<T,U>(arg:[T,U]):[U,T] {
    return [arg[1],arg[0]]
}

swap<number,number>([1,2]); // [2,1]
swap<number,string>([1,"hello"]); // ["hello",1] */



type Sex = "man"|"woman"|"secret";

interface Person {
    name: string,
    age: number,
    sex: Sex,
}

// 此时函数还未执行, 不知道T上有name属性 => 报错
// function showMsg<T>(arg:T):string{
//     return arg.name;
// }

function showMsg<T extends Person>(arg:T):string{
    return arg.name;
}



// 泛型类型参数的默认值
function swap<T=number,U=string>(arg:[T,U]):[U,T] {
    return [arg[1],arg[0]]
}

swap([1,"hello"]); // ["hello",1]













export default 10;